
// 购物车模块
import { getNewCartGoods } from '@/api/cart'

export default {
  namespaced: true,
  state() {
    return {
      // 购物车商品列表
      list: []
    }
  },
  getters: {
    // 有效商品列表
    validList(state) {
      return state.list.filter(goods => goods.stock > 0 && goods.isEffective)
    },
    // 有效商品总件数
    validTotal(state, getters) {
      // p + c 从下标为0的地方开始相加
      return getters.validList.reduce((p, c) => p + c.count, 0)
    },
    // 有效商品总金额X
    validAmount(state, getters) {
      return getters.validList.reduce((p, c) => p + c.count * parseInt(c.nowPrice * 100), 0) / 100
    },
    // 无效商品列表
    invalidList(state) {
      return state.list.filter(item => !(item.stock > 0 && item.isEffective))
    },
    // 选中商品列表
    selectedList(state, getters) {
      return getters.validList.filter(item => item.selected)
    },
    // 选中商品件数
    selectedTotal(state, getters) {
      return getters.selectedList.reduce((p, c) => p + c.count, 0)
    },
    // 选中商品总金额
    selectedAmount(state, getters) {
      return getters.selectedList.reduce((p, c) => p + Math.round(c.nowPrice * 100) * c.count, 0) / 100
    },
    // 是否全选
    isCheckAll(state, getters) {
      return getters.validList.length === getters.selectedList.length && getters.selectedList.length !== 0
    }
  },
  // 本地：id skuId name picture price nowPrice count attrsText selected stock isEffective
  // 线上：比上面多 isCollect 有用 discount 无用 两项项信息
  mutations: {
    insertCart(state, goods) {
      const sameIndex = state.list.findIndex(item => item.skuId === goods.skuId)
      // 逻辑：有相同的给goods累加数量，删除相同skuId的商品
      if (sameIndex >= 0) {
        goods.count = state.list[sameIndex].count + goods.count
        // 删除原来商品
        state.list.splice(sameIndex, 1)
      }
      // 追加新的
      state.list.unshift(goods)
    },
    // 修改本地购物车商品
    updateCart(state, goods) {
      // goods 商品信息 必须有skuId
      // 对象中有哪些字段就改哪些字段 字段的值合理才修改
      const updateGoods = state.list.find(item => item.skuId === goods.skuId)
      if (updateGoods) {
        for (const key in goods) {
          if (goods[key] !== undefined && goods[key] !== null && goods[key] !== '') {
            updateGoods[key] = goods[key]
            // console.log(updateGoods)
          }
        }
      }
    },
    // 删除购物车商品
    deleteCart(state, skuId) {
      const index = state.list.findIndex(item => item.skuId === skuId)
      state.list.splice(index, 1)
    }

  },
  actions: {
    // 加入购物车
    insertCart(ctx, goods) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.token) {
          // 已登录 TODO

        } else {
          // 未登录
          ctx.commit('insertCart', goods)
          resolve()
        }
      })
    },
    // 获取商品列表
    findCart(ctx) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 已登录 TODO

        } else {
          // 未登录
          // 同时发送请求 有几个商品就发几个请求 等所有请求成功 一并去修改本地数据
          // Promise.all(promise数组).then((dataList) => {}) 同时发请求 所有请求成功，
          // 传参事promise数组

          // const promiseArr = ctx.state.list.map(goods => {
          //   // 返回接口函数的调用
          //   return getNewCartGoods(goods.skuId)
          // })
          // // dataList成功结果的集合 数据顺序和promiseArr顺序一致 他有事根据state.list而来
          // Promise.all(promiseArr).then(results => {
          //   results.forEach((data, i) => {
          //     ctx.commit('updateCart', { skuId: ctx.state.list[i].skuId, ...data.result })
          //   })

          ctx.state.list.map(item => {
            console.log(item.skuId);
            getNewCartGoods(item.skuId).then((res) => {
              ctx.commit('updateCart', { skuId: item.id, ...res.result })
            })

            // 调用resolve方法 代表成功
            resolve()
          })
          // .catch(e => {
          //   reject(e)
          // })
        }
      })
    },
    // 删除购物车商品
    deleteCart(ctx, skuId) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 登录 TODO
        } else {
          // 本地
          ctx.commit('deleteCart', skuId)
          resolve()
        }
      })
    },
    // 修改购物车商品
    updateCart(ctx, payload) {
      // goods 中：必须有skuId，其他想修改的属性 selected  count
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 登录 TODO
        } else {
          // 本地
          console.log(ctx, payload);
          ctx.commit('updateCart', payload)
          resolve()
        }
      })
    },
    // 做有效商品的全选&反选
    checkAllCart(ctx, selected) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 登录 TODO
        } else {
          // 本地
          // 1. 获取有效的商品列表，遍历的去调用修改mutations即可
          ctx.getters.validList.forEach(goods => {
            ctx.commit('updateCart', { skuId: goods.skuId, selected })
          })
          resolve()
        }
      })
    },
    // 批量删除选中商品
    batchDeleteCart(ctx, isClear) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 登录 TODO
        } else {
          // 本地
          // 1. 获取选中商品列表，进行遍历调用deleteCart mutataions函数
          ctx.getters[isClear ? 'invalidList' : 'selectedList'].forEach(item => {
            ctx.commit('deleteCart', item.skuId)
          })
          resolve()
        }
      })
    },

    // 修改sku规格函数
    updateCartSku(ctx, { oldSkuId, newSku }) {
      return new Promise((resolve, reject) => {
        if (ctx.rootState.user.profile.token) {
          // 登录 TODO
        } else {
          // 本地
          // 但你修改了sku的时候其实skuId需要更改，相当于把原来的信息移出，创建一条新的商品信息。
          // 1. 获取旧的商品信息
          const oldGoods = ctx.state.list.find(item => item.skuId === oldSkuId)
          // 2. 删除旧的商品
          ctx.commit('deleteCart', oldSkuId)
          // 3. 合并一条新的商品信息
          const { skuId, price: nowPrice, inventory: stock, specsText: attrsText } = newSku
          const newGoods = { ...oldGoods, skuId, nowPrice, stock, attrsText }
          // 4. 去插入即可
          ctx.commit('insertCart', newGoods)
        }
      })
    },
  }
}
